import pandas as pd
import numpy as np

#3.1数据结构和序列
# 3.1.1元组
tup = (4, 5, 6)#创建元组
tup = tuple('string') #用tuple可以将任意序列或迭代器转换成元组

#拆分元组
tup = (4, 5, 6)
a, b, c = tup #a=4,b=5,c=6

# 如果元组中的某个对象是可变的，比如列表，可以在原位进行修改：
tup = tuple(['foo', [1, 2], True])
tup[1].append(3)
print(tup)

# 可以用加号运算符将元组串联起来
tup = (4, None, 'foo') + (6, 0) + ('bar','123')

# 元组乘以一个整数，像列表一样，会将几个元组的复制串联起来：
tup = ('foo', 'bar') * 4  #('foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar')

#tuple方法
a = (1, 2, 2, 2, 3, 4, 2)
a.count(2)#统计某个值得出现频率

# 3.12 列表

#添加和删除元素(append/remove)
b_list = ['foo', 'bar', 'baz']
b_list.append('abc')#添加元素
b_list.remove('abc')#删除元素

#串联和组合列表(+/extend,extend优于+)
a_list = ['foo1', 'bar2', 'baz3']
b_list = ['foo', 'bar', 'baz']
c_list = a_list + b_list
b_list.extend(a_list)

# 3.13内建序列函数

# enumerate函数(返回(i, value)元组序列)
some_list = ['foo', 'bar', 'baz']
mapping = {}
for i,v in enumerate(some_list):
    mapping[v] = i
    print(mapping)

#sorted函数(可以从任意序列的元素返回一个新的排好序的列表)
sorted([7, 1, 2, 6, 0, 3, 2]) #[0, 1, 2, 2, 3, 6, 7]

#zip函数
seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
zipped = zip(seq1, seq2)#压缩数据
print(list(zipped))

first_names, last_names = zip(*zipped)#解压数据
print(first_names)
print(last_names)

#reversed函数(从后向前迭代一个序列)
list(reversed(range(10))) #[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]


# 3.14字典

# 3.15 集合

# 3.16列表、集合和字典推导式([expr for val in collection if condition])
# result = []
# for val in collection:
#     if condition:
#         result.append(expr)

# 过滤出长度在2及以下的字符串，并将其转换成大写
strings = ['a', 'as', 'bat', 'car', 'dove', 'python']
[x.upper() for x in strings if len(x) > 2]
['BAT', 'CAR', 'DOVE', 'PYTHON']


states = ['   Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda',
          'south   carolina##', 'West virginia?']


import re

def clean_strings(strings):
    result = []
    for value in strings:
        value = value.strip()
        value = re.sub('[!#?]', '', value)
        value = value.title()
        result.append(value)
    return result

clean_strings(states)








